extern void asm_print(char*,int); // 通知编译器这个函数并不在当前文件中定义
/*
我们知道它定义在文件C_with_S_S.S中，但编译器是不知道的，所以只能在链接阶段将此函数重新定位，编排地址。
*/
// c_print的实现，在它的内部，它又调用了汇编代码C_with_S_S.S中的函数asm_print，经过第1行的声明，我们要给它提供两个参数：字符串的起始地址及长度。
/*
特别强调一下，由于这里并不打算把C标准库也链接进来，所以在求字符串长度时，我们不能用string.h中的strlen函数。也就是说即使include <string.h>将其strlen的声明加进来，没有strlen实现本身所在的.o文件也是不行的。函数声明的作用是：一方面告诉编译器该函数的参数所需要的栈空间大小及返回值，这样编译器能为其准备好执行环境；另一方面如果该函数是在外部文件中定义的，一定要在链接阶段时将其对应的目标文件一块链接进来。
*/
void c_print(char* str) {
     int len=0;
     while(str[len++]); // 通过while循环求字符串的长度。字符串结尾必须是空字符'\0'才行，否则while就是死循环了。这个字符串是代码C_with_S_S.S提供的，我们转过去看看
     asm_print(str, len);
}

